From c9c430df0062e0f6a1d95c5d3eb8af267183c6f0 Mon Sep 17 00:00:00 2001 From: Tamas K Lengyel Date: Fri, 5 Feb 2016 14:20:16 -0700 Subject: [PATCH] vm_event: Fix regression caused by b701ccc8 When xc_map_foreign_batch got deprecated reinitializing vm_event on a domain where an event listener was previously active broke as it relied on the flag XEN_DOMCTL_PFINFO_XTAB to indicate that the magic page is not in the physmap. Manually check the gpfn type, add it to the physmap if needed, and only then try to map it. Signed-off-by: Tamas K Lengyel Cc: Ian Jackson Cc: Stefano Stabellini Cc: Ian Campbell Cc: Wei Liu Cc: Andrew Cooper Acked-by: Ian Campbell --- tools/libxc/xc_vm_event.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c index 57abce0922..443c73b1f9 100644 --- a/tools/libxc/xc_vm_event.c +++ b/tools/libxc/xc_vm_event.c @@ -72,11 +72,10 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, ring_pfn = pfn; mmap_pfn = pfn; - ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ | PROT_WRITE, - &mmap_pfn, 1); - if ( !ring_page ) + rc1 = xc_get_pfn_type_batch(xch, domain_id, 1, &mmap_pfn); + if ( rc1 || mmap_pfn & XEN_DOMCTL_PFINFO_XTAB ) { - /* Map failed, populate ring page */ + /* Page not in the physmap, try to populate it */ rc1 = xc_domain_populate_physmap_exact(xch, domain_id, 1, 0, 0, &ring_pfn); if ( rc1 != 0 ) @@ -84,15 +83,15 @@ void *xc_vm_event_enable(xc_interface *xch, domid_t domain_id, int param, PERROR("Failed to populate ring pfn\n"); goto out; } + } - mmap_pfn = ring_pfn; - ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ | PROT_WRITE, + mmap_pfn = ring_pfn; + ring_page = xc_map_foreign_pages(xch, domain_id, PROT_READ | PROT_WRITE, &mmap_pfn, 1); - if ( !ring_page ) - { - PERROR("Could not map the ring page\n"); - goto out; - } + if ( !ring_page ) + { + PERROR("Could not map the ring page\n"); + goto out; } switch ( param ) -- 2.30.2